SQL tips

テストのためのテーブル差分確認用のSQL

なぜSQLで行うか

  • exportしてから行うのはめんどう
  • exportする場合、事前にsortする必要がある
  • データ量が多くてexportもdiffとるのも大変
select "a-b", * from actual_table
except
select "a-b", * from expected_table
union all
select "b-a", * from expected_table
except
select "b-a", * from actual_table

横持ちを縦持ちに

逆はよくやるけど、こちらはあまりやらないので忘れてしまうためメモ

  • よくある横持ちを縦持ちにするクエリ
  • M人のN種類のサマった結果(M * N)の表を
  • 種類別のレコードM * N行に変換する
  • ただし、IDとサマった結果に加えて種類の列が追加される(M*N * 3)
create table yoko
(
    id int
    , a_cnt int
    , b_cnt int
    , c_cnt int
)
;
insert into yoko values
(1, 1, 2, 3)
, (2, 4, 5, 6)
, (3, 7, 8, 9)
;
create table names
(
    id int
    , name varchar
)
;
insert into names values
(1, 'a'), (2, 'b'), (3, 'c')
;
-- yoko to tate
select
    yoko.id
    , p.id
    , p.name
    , case
        when p.id = 1 then yoko.a_cnt
        when p.id = 2 then yoko.b_cnt
        when p.id = 3 then yoko.c_cnt
        else null
    end as cnt
from yoko
cross join names  as p

下記の各種cntをIDによって使うものを変えるだけ

| id | a_cnt | b_cnt | c_cnt | id | name | |—-|——-|——-|——-|—-|——| | 1 | 1 | 2 | 3 | 1 | a | | 2 | 4 | 5 | 6 | 1 | a | | 3 | 7 | 8 | 9 | 1 | a | | 1 | 1 | 2 | 3 | 2 | b | | 2 | 4 | 5 | 6 | 2 | b | | 3 | 7 | 8 | 9 | 2 | b | | 1 | 1 | 2 | 3 | 3 | c | | 2 | 4 | 5 | 6 | 3 | c | | 3 | 7 | 8 | 9 | 3 | c |

pandas version

https://gist.github.com/ksomemo/bc9b336ab7e0aa604eae

with 複数

with aaa as (
  select 1 as a
)
, bbb as (
  select a, 1 as b
  from aaa
)
select a, b, 1 as c
from bbb

-- a b c
-- 1 1 1